using SqlSugar;
using static System.Net.Mime.MediaTypeNames;
namespace iPanel.DataProvider;

[SugarTable("OtlpNodeMapApplications")]
public class OtlpNodeMapApplicationEntity
{
    [SugarColumn(IsPrimaryKey = true)]
    public Guid Id { get; set; }
    public string NodeId { get; set; }
    public DateTime CreateAt { get; set; } = DateTime.UtcNow;
}

/// <summary>
/// 表示一个 OpenTelemetry 协议（OTLP）应用程序的实体类。
/// 该类对应数据库中的 OtlpApplications 表，包含应用程序的基本信息和相关的日志、跟踪和指标数据。
/// </summary>
[SugarTable("OtlpApplications")]
public class OtlpApplicationEntity
{
    /// <summary>
    /// 获取或设置应用程序的唯一标识符，作为数据库表的主键，自增生成。
    /// </summary>
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int Id { get; set; }

    /// <summary>
    /// 获取或设置应用程序的名称。
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// 获取或设置应用程序的实例 ID。
    /// </summary>
    public string InstanceId { get; set; }

    /// <summary>
    /// 获取或设置与该应用程序关联的日志条目列表。
    /// 该属性在数据库操作中被忽略，仅用于内存中的对象关系。
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public virtual List<OtlpLogEntryEntity> LogEntries { get; set; } = new List<OtlpLogEntryEntity>();

    /// <summary>
    /// 获取或设置与该应用程序关联的跟踪数据列表。
    /// 该属性在数据库操作中被忽略，仅用于内存中的对象关系。
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public virtual List<OtlpTraceEntity> Traces { get; set; } = new List<OtlpTraceEntity>();

    /// <summary>
    /// 获取或设置与该应用程序关联的指标仪器列表。
    /// 该属性在数据库操作中被忽略，仅用于内存中的对象关系。
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public virtual List<OtlpInstrumentEntity> Instruments { get; set; } = new List<OtlpInstrumentEntity>();
}

/// <summary>
/// 表示一个 OpenTelemetry 协议（OTLP）日志条目的实体类。
/// 该类对应数据库中的 OtlpLogEntries 表，包含日志条目的详细信息。
/// </summary>
[SugarTable("OtlpLogEntries")]
[SugarIndex("OtlpLogEntries_Index_Severity", nameof(Severity), OrderByType.Desc)]
[SugarIndex("OtlpLogEntries_Index_CreateAt", nameof(TimeStamp), OrderByType.Desc)]
[SugarIndex("OtlpLogEntries_Index_Application", nameof(Application), OrderByType.Asc)]
[SugarIndex("OtlpLogEntries_Index_ApplicationKey", nameof(ApplicationKey), OrderByType.Asc)]
public class OtlpLogEntryEntity
{
    /// <summary>
    /// 获取或设置日志条目的唯一标识符
    /// </summary>
    [SugarColumn(IsPrimaryKey = true)]
    public Guid Id { get; set; }

    /// <summary>
    /// 获取或设置生成该日志条目的应用程序的键。
    /// </summary>
    public string Application { get; set; }
    public string ApplicationKey { get; set; }
    public string ApplicationInstanceId { get; set; }

    /// <summary>
    /// 获取或设置日志条目的严重程度。
    /// </summary>
    public LogLevel Severity { get; set; }

    /// <summary>
    /// 获取或设置日志条目的消息内容。
    /// </summary>
    [SugarColumn(Length = -1)]
    public string Message { get; set; }

    /// <summary>
    /// 获取或设置日志条目的时间戳。
    /// </summary>
    public DateTime TimeStamp { get; set; }

    /// <summary>
    /// 获取或设置关联的 OtlpApplication 实体的 ID。
    /// </summary>
    public int OtlpApplicationId { get; set; }

    [SugarColumn(IsJson = true)]
    public IEnumerable<AttributeItem> Attributes { get; set; }
    public long Flags { get; set; }
    public string SpanId { get; set; }
    public string TraceId { get; set; }
    public string ParentId { get; set; }
    [SugarColumn(Length = -1)]
    public string? OriginalFormat { get; set; }

    // Scope
    public string Category { get; set; } // ScopeName

    public string ScopeVersion { get; set; }
}

public class AttributeItem
{
    public string Key { get; set; }
    public string Value { get; set; }
}


/// <summary>
/// 存储日志属性键的集合，用于快速根据Application查找。
/// </summary>
public class OtlpLogPropertyKeysEntity
{
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int Id { get; set; }
    public string Application { get; set; }
    public int OtlpApplicationId { get; set; }
    public string PropertyName { get; set; }
}

/// <summary>
/// 存储跟踪属性键的集合，用于快速根据Application查找。
/// </summary>
public class OtlpTracePropertyKeysEntity
{
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int Id { get; set; }
    public string Application { get; set; }
    public int OtlpApplicationId { get; set; }
    public string PropertyName { get; set; }
}

// OtlpTrace 类
[SugarTable("OtlpTraces")]
[SugarIndex("OtlpTraces_Index_TraceId", nameof(TraceId), OrderByType.Asc)]
[SugarIndex("OtlpTraces_Index_Application", nameof(Application), OrderByType.Asc)]
[SugarIndex("OtlpTraces_Index_ApplicationKey", nameof(ApplicationKey), OrderByType.Asc)]
[SugarIndex("OtlpTraces_Index_CreateAt", nameof(CreateAt), OrderByType.Desc)]
public class OtlpTraceEntity
{
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int Id { get; set; }
    public string TraceId { get; set; }
    public string Application { get; set; }
    public string ApplicationKey { get; set; }
    public string ApplicationInstanceId { get; set; }
    public int OtlpApplicationId { get; set; }
    public DateTime CreateAt { get; set; } = DateTime.UtcNow;

    [SugarColumn(IsIgnore = true)]
    public virtual OtlpApplicationEntity OtlpApplication { get; set; }

    [SugarColumn(IsIgnore = true)]
    public virtual List<OtlpSpanEntity> Spans { get; set; } = new List<OtlpSpanEntity>();

}

// OtlpSpan 类
/// <summary>
/// 表示一个 OpenTelemetry 协议（OTLP）跨度的实体类。
/// 该类对应数据库中的 OtlpSpans 表，包含跨度的详细信息，如所属跟踪、应用程序、开始和结束时间等。
/// </summary>
[SugarTable("OtlpSpans")]
[SugarIndex("OtlpSpans_Index_TraceId", nameof(TraceId), OrderByType.Asc)]
[SugarIndex("OtlpSpans_Index_Application", nameof(Application), OrderByType.Asc)]
[SugarIndex("OtlpSpans_Index_ApplicationKey", nameof(ApplicationKey), OrderByType.Asc)]
[SugarIndex("OtlpSpans_Index_StartTime", nameof(StartTime), OrderByType.Asc)]
[SugarIndex("OtlpSpans_Index_Status", nameof(Status), OrderByType.Asc)]
public class OtlpSpanEntity
{
    /// <summary>
    /// 获取或设置跨度的唯一标识符，作为数据库表的主键，自增生成。
    /// </summary>
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int Id { get; set; }
    public int OtlpTraceId { get; set; }

    /// <summary>
    /// 获取或设置该跨度所属的跟踪的唯一标识符。
    /// </summary>
    public string TraceId { get; set; }

    /// <summary>
    /// 获取或设置生成该跨度的应用程序的名称。
    /// </summary>
    public string Application { get; set; }
    public string ApplicationKey { get; set; }
    public string ApplicationInstanceId { get; set; }

    /// <summary>
    /// 获取或设置关联的 OtlpApplication 实体的 ID。
    /// </summary>
    public int OtlpApplicationId { get; set; }

    /// <summary>
    /// 获取或设置该跨度的唯一标识符。
    /// </summary>
    public string SpanId { get; set; }

    /// <summary>
    /// 获取或设置该跨度的父跨度的唯一标识符。
    /// </summary>
    public string ParentSpanId { get; set; }

    /// <summary>
    /// 获取或设置该跨度的名称。
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// 获取或设置该跨度的类型。
    /// </summary>
    public OtlpSpanKind Kind { get; set; }

    /// <summary>
    /// 获取或设置该跨度的开始时间。
    /// </summary>
    public DateTime StartTime { get; set; }

    /// <summary>
    /// 获取或设置该跨度的结束时间。
    /// </summary>
    public DateTime EndTime { get; set; }

    /// <summary>
    /// 获取或设置该跨度的状态码。
    /// </summary>
    public OtlpSpanStatusCode Status { get; init; }

    /// <summary>
    /// 获取或设置该跨度的状态消息。
    /// </summary>
    public string? StatusMessage { get; set; }

    /// <summary>
    /// 获取或设置该跨度的状态信息。
    /// </summary>
    public string? State { get; set; }

    // Scope
    public string Category { get; set; } // ScopeName
    public string ScopeVersion { get; set; }

    /// <summary>
    /// 获取或设置该跨度的属性列表，以 JSON 格式存储在数据库中。
    /// </summary>
    [SugarColumn(IsJson = true)]
    public IEnumerable<AttributeItem> Attributes { get; set; }

    /// <summary>
    /// 获取或设置与该跨度关联的 OtlpTrace 实体。
    /// 该属性在数据库操作中被忽略，仅用于内存中的对象关系。
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public virtual OtlpTraceEntity OtlpTrace { get; set; }

    /// <summary>
    /// 获取或设置与该跨度相关的正向链接列表。
    /// 正向链接通常表示当前跨度指向其他跨度的关联关系。
    /// 该属性在数据库操作中被忽略，仅用于内存中的对象关系。
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public virtual List<OtlpSpanLinkEntity> Links { get; set; } = new List<OtlpSpanLinkEntity>();

    /// <summary>
    /// 获取或设置与该跨度相关的反向链接列表。
    /// 反向链接表示其他跨度指向当前跨度的关联关系。
    /// 该属性在数据库操作中被忽略，仅用于内存中的对象关系。
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public virtual List<OtlpSpanLinkEntity> Backlinks { get; set; } = new List<OtlpSpanLinkEntity>();

    /// <summary>
    /// 获取或设置与该跨度相关的事件列表。
    /// 该属性在数据库操作中被忽略，仅用于内存中的对象关系。
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public virtual List<OtlpSpanEventEntity> Events { get; set; } = new List<OtlpSpanEventEntity>();
}

// OtlpSpanLink 类
/// <summary>
/// 表示一个 OpenTelemetry 协议（OTLP）跨度链接的实体类。
/// 该类对应数据库中的 OtlpSpanLinks 表，包含跨度链接的详细信息，如源跨度、目标跨度等。
/// </summary>
[SugarTable("OtlpSpanLinks")]
[SugarIndex("OtlpSpanLinks_Index_TraceId", nameof(TraceId), OrderByType.Asc)]
[SugarIndex("OtlpSpanLinks_Index_StartTime", nameof(CreateAt), OrderByType.Asc)]
public class OtlpSpanLinkEntity
{
    /// <summary>
    /// 获取或设置跨度链接的唯一标识符，作为数据库表的主键，自增生成。
    /// </summary>
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int Id { get; set; }
    public int OtlpApplicationId { get; set; }

    /// <summary>
    /// 获取或设置关联的 OtlpSpan 实体的 ID。
    /// </summary>
    public int OtlSpanId { get; set; }

    /// <summary>
    /// 获取或设置源跨度的唯一标识符。
    /// </summary>
    public string SourceSpanId { get; set; }

    /// <summary>
    /// 获取或设置源跨度所属的跟踪的唯一标识符。
    /// </summary>
    public string SourceTraceId { get; set; }

    /// <summary>
    /// 获取或设置跟踪状态信息。
    /// </summary>
    public string TraceState { get; set; }

    /// <summary>
    /// 获取或设置目标跨度的唯一标识符。
    /// </summary>
    public string SpanId { get; set; }

    /// <summary>
    /// 获取或设置目标跨度所属的跟踪的唯一标识符。
    /// </summary>
    public string TraceId { get; set; }

    /// <summary>
    /// 获取或设置该跨度链接的属性列表，以 JSON 格式存储在数据库中。
    /// </summary>
    [SugarColumn(IsJson = true)]
    public IEnumerable<AttributeItem> Attributes { get; set; }

    /// <summary>
    /// 获取或设置与该跨度链接关联的 OtlpSpan 实体。
    /// 该属性在数据库操作中被忽略，仅用于内存中的对象关系。
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public virtual OtlpSpan OtlpSpan { get; set; }

    [SugarColumn(IsOnlyIgnoreUpdate = true)]
    public DateTime CreateAt { get; set; } = DateTime.UtcNow;
}

// OtlpSpanEvent 类
[SugarTable("OtlpSpanEvents")]
[SugarIndex("OtlpSpans_Index_TraceId", nameof(TraceId), OrderByType.Asc)]
[SugarIndex("OtlpSpans_Index_Time", nameof(Time), OrderByType.Asc)]
public class OtlpSpanEventEntity
{
    [SugarColumn(IsPrimaryKey = true)]
    public Guid Id { get; set; }
    public int OtlpSpanId { get; set; }
    public string TraceId { get; set; }
    public string Name { get; set; }
    public DateTime Time { get; set; }

    [SugarColumn(IsJson = true)]
    public IEnumerable<AttributeItem> Attributes { get; set; }
    [SugarColumn(IsIgnore = true)]
    public virtual OtlpSpan OtlpSpan { get; set; }
}


// OtlpInstrumentKey 类
/// <summary>
/// 表示一个 OpenTelemetry 协议（OTLP）指标仪器键的实体类。
/// 该类对应数据库中的 OtlpInstrumentKeys 表，用于存储指标仪器的键信息，
/// 这些键信息可用于唯一标识不同的指标仪器，辅助对指标数据的管理和查询。
/// </summary>
[SugarTable("OtlpInstrumentKeys")]
public class OtlpInstrumentKeyEntity
{
    /// <summary>
    /// 获取或设置指标仪器键的唯一标识符，作为数据库表的主键，自增生成。
    /// </summary>
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int Id { get; set; }

    /// <summary>
    /// 获取或设置指标仪器所属的仪表名称。
    /// 仪表名称可用于对指标仪器进行分类和组织。
    /// </summary>
    public string MeterName { get; set; }

    /// <summary>
    /// 获取或设置指标仪器的名称。
    /// 该名称是指标仪器的具体标识，可用于区分不同的指标仪器。
    /// </summary>
    public string InstrumentName { get; set; }
}

// OtlpInstrument 类
/// <summary>
/// 表示一个 OpenTelemetry 协议（OTLP）指标仪器的实体类。
/// 该类对应数据库中的 OtlpInstruments 表，包含指标仪器的详细信息，
/// 如所属的指标仪器键、关联的应用程序等。
/// </summary>
[SugarTable("OtlpInstruments")]
public class OtlpInstrumentEntity
{
    /// <summary>
    /// 获取或设置指标仪器的唯一标识符，作为数据库表的主键，自增生成。
    /// </summary>
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int Id { get; set; }

    /// <summary>
    /// 获取或设置关联的 OtlpInstrumentKey 实体的 ID。
    /// 该 ID 用于关联指标仪器和其对应的键信息。
    /// </summary>
    public int OtlpInstrumentKeyId { get; set; }

    /// <summary>
    /// 获取或设置与该指标仪器关联的 OtlpInstrumentKey 实体。
    /// 该属性在数据库操作中被忽略，仅用于内存中的对象关系。
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public virtual OtlpInstrumentKey InstrumentKey { get; set; }

    /// <summary>
    /// 获取或设置该指标仪器所属的 OtlpApplication 实体的 ID。
    /// 该 ID 用于关联指标仪器和其所属的应用程序。
    /// </summary>
    public int OtlpApplicationId { get; set; }

    /// <summary>
    /// 获取或设置与该指标仪器关联的 OtlpApplication 实体。
    /// 该属性在数据库操作中被忽略，仅用于内存中的对象关系。
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public virtual OtlpApplication OtlpApplication { get; set; }

    /// <summary>
    /// 获取或设置该指标仪器的摘要信息。
    /// 摘要信息可提供关于指标仪器的简要描述和统计信息。
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public OtlpInstrumentSummary Summary { get; set; }
}

// OtlpInstrumentSummary 类
/// <summary>
/// 表示一个 OpenTelemetry 协议（OTLP）指标仪器摘要的实体类。
/// 该类对应数据库中的 OtlpInstrumentSummaries 表，用于存储指标仪器的摘要信息，
/// 如名称、描述、单位、类型等，方便对指标仪器进行快速了解和统计。
/// </summary>
[SugarTable("OtlpInstrumentSummaries")]
public class OtlpInstrumentSummaryEntity
{
    /// <summary>
    /// 获取或设置指标仪器摘要的唯一标识符，作为数据库表的主键，自增生成。
    /// </summary>
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int Id { get; set; }

    /// <summary>
    /// 获取或设置指标仪器的名称。
    /// 该名称用于标识指标仪器，方便用户识别。
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// 获取或设置指标仪器的描述信息。
    /// 描述信息可详细说明指标仪器的功能和用途。
    /// </summary>
    public string Description { get; set; }

    /// <summary>
    /// 获取或设置指标仪器的测量单位。
    /// 单位信息用于明确指标仪器所测量数据的度量标准。
    /// </summary>
    public string Unit { get; set; }

    /// <summary>
    /// 获取或设置指标仪器的类型。
    /// 类型信息可用于对指标仪器进行分类，如计数器、仪表盘等。
    /// </summary>
    public string Type { get; set; }

    /// <summary>
    /// 获取或设置关联的 OtlpMeter 实体的 ID。
    /// 该 ID 用于关联指标仪器摘要和其所属的仪表。
    /// </summary>
    public int OtlpMeterId { get; set; }

    /// <summary>
    /// 获取或设置与该指标仪器摘要关联的 OtlpMeter 实体。
    /// 该属性在数据库操作中被忽略，仅用于内存中的对象关系。
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public virtual OtlpMeter Parent { get; set; }
}

// OtlpMeter 类
/// <summary>
/// 表示一个 OpenTelemetry 协议（OTLP）仪表的实体类。
/// 该类对应数据库中的 OtlpMeters 表，包含仪表的基本信息，如作用域名称。
/// 仪表可用于组织和管理相关的指标仪器。
/// </summary>
[SugarTable("OtlpMeters")]
public class OtlpMeterEntity
{
    /// <summary>
    /// 获取或设置仪表的唯一标识符，作为数据库表的主键，自增生成。
    /// </summary>
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
    public int Id { get; set; }

    /// <summary>
    /// 获取或设置仪表的作用域名称。
    /// 作用域名称可用于对仪表进行分组和区分，反映其应用场景和范围。
    /// </summary>
    public string ScopeName { get; set; }
}

/// <summary>
/// 资源列表
/// </summary>
[SugarTable("OtlpResources")]
public class OtlpResourceEntity
{
    /// <summary>
    /// 节点名称
    /// </summary>
    [SugarColumn(IsPrimaryKey = true)]
    public string NodeId { get; set; }
    public string Ip { get; set; }
    public string State { get; set; }
    public long Cpu { get; set; }
    public long DownTcp { get; set; }
    public long ProcessDownTcp { get; set; }
    public long ProcessMem { get; set; }
    public long ProcessUpTcp { get; set; }
    public long TotalDisk { get; set; }
    public long TotalMem { get; set; }
    public long UpTcp { get; set; }
    public long UseDisk { get; set; }
    public long UseMem { get; set; }
    public long AvailableDiskSpace { get; set; }
    public long AvailableMemory { get; set; }
    public DateTime ModifyAt { get; set; }
    [SugarColumn(IsOnlyIgnoreUpdate = true)]
    public DateTime CreateAt { get; set; } = DateTime.UtcNow;
}
